package com.demo.Main.FtpUtil;


import cn.hutool.extra.ftp.Ftp;
import cn.hutool.extra.ftp.FtpMode;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ConnectException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class QTest {
    public static void main(String[] args) {
        String str;
        //程序会尝试打开名为 “info.json” 的文件，并将其内容读取为字符串。
        try (FileInputStream fis = new FileInputStream(new File("localfile/info.json"))) {
            str = new String(fis.readAllBytes());
            //获取的字符串中创建一个 JSONArray 对象
            JSONArray jsonArray = new JSONArray(str);
            check(jsonArray);
            sendFiles(jsonArray);
        } catch (FileNotFoundException e) {
            throw new RuntimeException("文件不存在", e);
        } catch (IOException e) {
            throw new RuntimeException("读取文件失败", e);
        }
    }

    /**
     * 验证用户连接和登录情况
     *
     * @param jsonArray 包含用户信息的 JSONArray 对象
     */
    public static void check(JSONArray jsonArray) {
        boolean isInvalidUser = false;
        //然后遍历这个数组中的每个元素，每个元素都是一个 JSON 对象
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject json = jsonArray.getJSONObject(i);
            //从每个 JSON 对象中获取属性：ip（字符串类型）、port（整数类型）、username（字符串类型）以及 password（字符串类型）。
            String s = json.getStr("ip");
            int port = json.getInt("port");
            String user = json.getStr("username");
            String password = json.getStr("password");

            //创建一个 HttpRequest 对象，使用从 JSON 对象获取的 ip、port、username 和 password 设置请求的目标地址和身份验证信息
            HttpRequest httpRequest = HttpRequest.get(s).timeout(2000).basicAuth(user, password);
            HttpResponse execute;
            try {
                execute = httpRequest.execute();
                System.out.println("执行成功：" + execute.getStatus());
                if (execute.getStatus() != 200) {
                    System.out.println("服务器状态异常：" + json.getStr("ip"));
                }
                //根据遍历过程中是否存在连接超时的情况，打印相应的提示信息。
            } catch (Exception e) {
                System.out.println("连接超时：" + json.getStr("ip") + "，端口：" + port);
                isInvalidUser = true;
            }
        }

        if (isInvalidUser) {
            System.out.println("存在无法登录的用户");
        } else {
            System.out.println("所有用户均可登录");
        }
    }

    /**
     * 发送文件给用户
     *
     * @param jsonArray 包含用户信息的 JSONArray 对象
     */
    public static void sendFiles(JSONArray jsonArray) {
        ExecutorService executorService = Executors.newFixedThreadPool(jsonArray.size());
        //创建一个固定大小的线程池
        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executorService;
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject server = jsonArray.getJSONObject(i);
            executorService.execute(() -> {
                try {
                    sendFile(server);
                } catch (Exception e) {
                    System.out.println("由于" + e.getMessage() + "  发送失败");
                }
            });
        }
        executorService.shutdown();
    }

    /**
     * 发送单个文件给指定用户
     *
     * @param json 包含用户信息和文件信息的 JSONObject 对象
     */
    public static void sendFile(JSONObject json) {
        String ip = json.getStr("ip");
        String user = json.getStr("username");
        String password = json.getStr("password");
        int port = json.getInt("port");
        String filePath = json.getStr("file");
        String saveFile = json.getStr("savefile");

        try (Ftp ftp = new Ftp(ip, port, user, password)) {
            ftp.setMode(FtpMode.Passive);

            File file = new File(filePath);
            try (FileInputStream fis = new FileInputStream(file)) {
                ftp.upload("", saveFile, fis);
                System.out.println("上传成功");
            } catch (FileNotFoundException e) {
                throw new RuntimeException("本地文件未找到", e);
            } catch (IOException e) {
                throw new RuntimeException("上传文件失败", e);
            }
        } catch (ConnectException e) {
            System.out.println("连接超时: " + e.getMessage() + ", IP: " + ip + ", 端口: " + port);
        } catch (IOException e) {
            System.out.println("关闭FTP连接失败：" + e.getMessage());
        }
    }
}